package com.cqsd.ioc.trait;

import com.cqsd.ioc.trait.use.FactoryBean;
import org.jetbrains.annotations.Contract;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Predicate;

/**
 * @author caseycheng
 * 存储的是单个Bean对象的信息
 * 用于管理解析完成的Bean信息.
 * 管理所有bean方法
 * 管理所有bean字段
 * 管理所有构造
 * 标识该Bean是否为单例Bean
 * @date 2023/3/11-10:42
 **/
public interface BeanInfo {
    /**
     * 获取类型
     *
     * @return
     */
    Class<?> getType();

    //    /**
    //     * 获取Bean公开方法
    //     *
    //     * @return
    //     */
    //    Method[] getPublicMethods();
    //
    //    /**
    //     * 获取Bean私有方法
    //     *
    //     * @return
    //     */
    //    Method[] getPrivateMethods();

    /**
     * 获取Bean的所有方法
     *
     * @return
     */
    Method[] getAllMethods();
    /**
     * 返回测试通过的method
     */
    Method[] getMethodsIf(Predicate<Method> action);

    /**
     * 强制解析
     */
    Method[] getMethodsIf(Predicate<Method> action,boolean re);

    /**
     * 获取Bean的所有字段
     *
     * @return
     */
    Field[] getAllField();

    /**
     * 获取Bean的构造
     *
     * @return
     */
    Constructor<?>[] getAllConstructor();

    /**
     * 判断是否为单例Bean
     *
     * @return
     */
    boolean isSingle();

    /**
     * 获取beanName
     *
     * @return
     */
    String getName();

    /**
     * 分配BeanName
     *
     * @param name
     */
    void setName(String name);

    /**
     * 是否懒加载
     *
     * @return
     */
    boolean isLaze();

    /**
     * 设置是否懒加载
     *
     * @param laze
     */
    void setLaze(boolean laze);

    /**
     * 添加一个bean 只存一个引用，不占内存，就是创建一个map比较占内存
     *
     * @param instance
     */
    void setBean(Object instance);

    /**
     * 获取该类型指向的bean
     *
     * @return
     */
    Object getBean();

    /**
     * 设置bean构建工厂
     *
     * @param factory
     */
    @Contract("null->fail")
    void setFactory(FactoryBean factory);

    /**
     * 获取Bean工厂
     *
     * @return 构建这个bean的工厂
     */
    FactoryBean getFactory();

    /**
     * 判断这个bean是否有bean工厂
     *
     * @return true|false
     */
    boolean isFactory();
}
